home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / gpp-1_42.lha / g++-1.42.0 / gnulib3.c < prev    next >
C/C++ Source or Header  |  1991-10-19  |  2KB  |  94 lines

  1. typedef struct set_vector
  2. {
  3.   int length;
  4.   int vector[1];
  5.   /* struct set_vector *next; */
  6. } set_vector;
  7.  
  8. extern set_vector __CTOR_LIST__;
  9. extern set_vector __DTOR_LIST__;
  10. set_vector *__dlp;
  11. int __dli;
  12.  
  13. extern void exit ();
  14. extern void __do_global_init ();
  15. extern void __do_global_cleanup ();
  16. extern void on_exit(void*, void*);
  17.  
  18. #if defined(i386) && !defined(sequent)
  19. #define COFF
  20. #endif
  21.  
  22. #ifdef COFF_ENCAPSULATE
  23. #undef COFF
  24. #endif
  25.  
  26. #if defined(sun)
  27. #define ON_EXIT(PROCP, ARG) \
  28.   do { extern void PROCP (); on_exit (PROCP, ARG); } while (0)
  29. #endif
  30.  
  31. int
  32. __main ()
  33. {
  34.   /* Gross hack for GNU ld.  This is defined in `builtin.cc'
  35.      from libg++.  */
  36. #ifndef COFF
  37.   extern int __1xyzzy__;
  38. #endif
  39.  
  40. #ifdef ON_EXIT
  41.  
  42. #ifdef sun
  43.   ON_EXIT (_cleanup, 0);
  44. #endif
  45.  
  46.   ON_EXIT (__do_global_cleanup, 0);
  47.  
  48. #endif
  49.   __dli = __DTOR_LIST__.length;
  50.   __dlp = &__DTOR_LIST__;
  51. #ifndef COFF
  52.   __do_global_init (&__1xyzzy__);
  53. #else
  54.   __do_global_init ();
  55. #endif
  56. }
  57.  
  58. #ifndef ON_EXIT
  59. void 
  60. exit (status)
  61.      int status;
  62. {
  63.   __do_global_cleanup ();
  64.   _cleanup ();
  65.   _exit (status);
  66. }
  67. #endif
  68.  
  69. void
  70. __do_global_init ()
  71. {
  72.   register int i, len;
  73.   register void (**ppf)() = (void (**)())__CTOR_LIST__.vector;
  74.  
  75.   len = __CTOR_LIST__.length;
  76.   for (i = 0; i < len; i++)
  77.     (*ppf[i])();
  78. }
  79.  
  80. void
  81. __do_global_cleanup ()
  82. {
  83.   while (__dlp)
  84.     {
  85.       while (--__dli >= 0)
  86.     {
  87.       void (*pf)() = (void (*)())__dlp->vector[__dli];
  88.       (*pf)();
  89.     }
  90.       __dlp = (struct set_vector *)__dlp->vector[__dlp->length];
  91.       if (__dlp) __dli = __dlp->length;
  92.     }
  93. }
  94.